package com.springboot.frame.wx.pay;

import com.springboot.frame.wx.config.WxConfig;

import java.io.InputStream;

/**
 * 域名管理，实现主备域名自动切换
 */
public abstract interface IWXPayDomain {
    /**
     * 上报域名网络状况
     * @param domain 域名。 比如：api.mch.weixin.qq.com
     * @param elapsedTimeMillis 耗时
     * @param ex 网络请求中出现的异常。
     *           null表示没有异常
     *           ConnectTimeoutException，表示建立网络连接异常
     *           UnknownHostException， 表示dns解析异常
     */
    abstract void report(final String domain, long elapsedTimeMillis, final Exception ex);

    /**
     * 获取域名
     * @param config 配置
     * @return 域名
     */
    abstract DomainInfo getDomain(final WxConfig config);

    static class DomainInfo{
        public String domain;       //域名
        public boolean primaryDomain;     //该域名是否为主域名。例如:api.mch.weixin.qq.com为主域名
        public DomainInfo(String domain, boolean primaryDomain) {
            this.domain = domain;
            this.primaryDomain = primaryDomain;
        }

        @Override
        public String toString() {
            return "DomainInfo{" +
                    "domain='" + domain + '\'' +
                    ", primaryDomain=" + primaryDomain +
                    '}';
        }
    }

    /**
     * 实例化配置类
     * @param args
     */
    public static void main(String[] args) {
       WxConfig config = new WxConfig() {
            @Override
            public String getAppID() {
                return null;
            }

           @Override
           public String getSecret() {
               return null;
           }

           @Override
            public String getMchID() {
                return null;
            }

            @Override
            public String getKey() {
                return null;
            }

           @Override
           public String getNotifyUrl() {
               return null;
           }

           @Override
            public InputStream getCertStream() {
                return null;
            }

            @Override
            public IWXPayDomain getWXPayDomain() {
                IWXPayDomain iwxPayDomain = new IWXPayDomain() {
                    @Override
                    public void report(String domain, long elapsedTimeMillis, Exception ex) {

                    }
                    @Override
                    public DomainInfo getDomain(WxConfig config) {
                        return new DomainInfo(WXPayConstants.DOMAIN_API, true);
                    }
                };
                return iwxPayDomain;
            }
        };
        DomainInfo domainInfo = config.getWXPayDomain().getDomain(config);
        System.out.println(domainInfo.toString());
    }

}
